﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIGEB.Prototipo.Control;
using System.Collections;
using SIGEB.Modelo.moduloGrupo;
using SIGEB.Modelo;
using SIGEB.Modelo.moduloUsuarios;
using SIGEB.Modelo.moduloPerfiles;

namespace SIGEB.Prototipo.Vista.moduloGrupo
{
    public partial class frm_Grupos : frm_IMEC
    {
        #region "constructores"

        public frm_Grupos()
        {
            InitializeComponent();
        }

        public frm_Grupos(controlPrincipal cp) : base(cp)
        {
            InitializeComponent();
            asignarUI(this.Controls);
            inicializarComponentes();
        }

        private void inicializarComponentes()
        {
            base.dgv_busqueda = this.dgv_listado;
        }

        #endregion

        #region "eventos"

        private void txt_nombre_TextChanged(object sender, EventArgs e)
        {
            //borrarError(txt_nombre);
            //lbl_mensajes.Text = string.Empty;
        }

        private void txt_descripcion_TextChanged(object sender, EventArgs e)
        {
            //borrarError(txt_descripcion);
            //lbl_mensajes.Text = string.Empty;
        }

        private void txt_multa_TextChanged(object sender, EventArgs e)
        {
            //borrarError(txt_multa);
            //lbl_mensajes.Text = string.Empty;
        }

        private void txt_multa_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsLetter(e.KeyChar) || Char.IsWhiteSpace(e.KeyChar) || Char.IsSymbol(e.KeyChar) || Char.IsPunctuation(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        private void cbx_tipoUsuario_SelectedIndexChanged(object sender, EventArgs e)
        {
            //borrarError(cbx_tipoUsuario);
            //lbl_mensajes.Text = string.Empty;
        }

        private void txb_busqueda_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode.Equals(Keys.Enter))
            {
                if (txb_busqueda.Text.Equals(string.Empty))
                {
                    if (modoB)
                    {
                        modoB = false;
                        finalizarBusqueda();
                    }
                }
                else
                {
                    modoB = true;
                    string[] v = new string[] { "columna1", "columna2" };
                    if (iniciarBusqueda(txb_busqueda.Text, v).Equals(0))
                    {
                        mostrarInfo("La búsqueda no generó ningún resultado.");
                        modoB = false;
                        finalizarBusqueda();
                    }
                }
            }
        }

        private void txb_busqueda_TextChanged(object sender, EventArgs e)
        {
            lbl_mensajes.Text = string.Empty;
        }

        /// <summary>
        /// se llama cuando se realiza una actualización de la base de datos
        /// en esta misma instancia
        /// </summary>
        /// <param name="referencia"></param>
        /// <param name="e"></param>
        public override void actualizar(object referencia, bibliotecaObservador.EventoActualizacion e)
        {
            int numTipo = (int)referencia;
            if (numTipo == conjuntoBase.CONJTIPOUSUARIO)
            {
                cargarDatosTipoUsuario();
            }
            else if (numTipo == conjuntoBase.CONJGRUPOS)
            {
                cargarDatosGrupo();
            }
        }

        /// <summary>
        /// carga en la ventana los datos de tipos usuario de acuerdo con los permisos que tiene el usuario actual
        /// </summary>
        private void cargarDatosTipoUsuario()
        {
            try
            {
                llenearTipoUsuarios(cp.ctrlGrupos.obtenerTiposUsuario());
            }
            catch (Exception ex)
            {
                ventanaError(ex.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        private void cargarDatosGrupo()
        {
            try
            {
                datosActuales = cp.ctrlGrupos.getGrupos();
                llenarDTGGrupo(datosActuales);
            }
            catch (Exception ex)
            {
                ventanaError(ex.Message);
            }
        }

        private void cargarDatosConjGrupo()
        {
            //llenarConjuntoGrupos();
        }

        private void llenarConjuntoGrupos(LinkedList<categoriaGrupos> categorias)
        {
            /*cbx_categoría.Items.Clear();
            foreach(*/
        }

        /// <summary>
        /// se llama cada vez que se abre la ventana y recibe
        /// los parámetros
        /// </summary>
        /// <param name="arg">se usa para que se le pase cualquier tipo de objeto al abrir la ventana</param>
        public override void hacerVisible(object[] arg)
        {
            base.hacerVisible(arg);
            PasarConsulta();
            cargarDatosGrupo();
            cargarDatosTipoUsuario();
            actualizaControles();
        }

        /// <summary>
        /// se activa cuando se selecciona alguna fila del DGV
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgv_listado_SelectionChanged(object sender, EventArgs e)
        {
            if (estado.CONSULTANDO())
            {
                grupoActual = getSelected();
                escribirGrupo();
            }
            actualizaControles();
        }

        #endregion

        #region "validación"

        #endregion

        #region "captura"

        /// <summary>
        /// obtiene el id del tipo perfil que fue seleccionado
        /// del combo box del los tipos de perfil
        /// </summary>
        /// <returns></returns>
        private string getTipoUsuarioSelected()
        {
            try
            {
                return ((comboBoxItem)cbx_tipoUsuario.SelectedItem).id;
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// obtiene un tipoUsuario creado con los campos de texto y combo box que hayan en el momento
        /// </summary>
        /// <returns></returns>
        private grupo getFromFields()
        {
            return new grupo(null, txt_nombre.Text, double.Parse(txt_multa.Text), txt_descripcion.Text, getTipoUsuarioSelected());
        }

        /// <summary>
        /// obtieneel grupo que se seleccionó del DGV
        /// </summary>
        /// <returns></returns>
        private grupo getSelected()
        {
            grupo nuevo = null;
            try
            {
                dgv_listado.Rows[dgv_listado.SelectedCells[0].RowIndex].Selected = true;
                String codigo = dgv_listado.SelectedRows[0].Cells[0].Value.ToString();
                if (codigo != null)
                {
                    nuevo = getGrupo(codigo);
                    if (nuevo != null)
                    {
                        grupoActual = nuevo;
                    }
                }
            }
            catch
            {

            }
            return nuevo;
        }

        /// <summary>
        /// obtiene un grupo entre la lista de datosActuales
        /// </summary>
        /// <param name="codigo"></param>
        /// <returns></returns>
        private grupo getGrupo(String codigo)
        {
            if (datosActuales != null)
            {
                foreach (grupo act in datosActuales)
                {
                    if (act.codGrupo.ToString() == codigo)
                    {
                        return act;
                    }
                }
            }
            return null;
        }

        #endregion

        #region "métodos"

        /// <summary>
        /// escribe tipoUsrActual en los campos de texto
        /// </summary>
        private void escribirGrupo()
        {
            if (grupoActual != null)
            {
                txt_nombre.Text = grupoActual.nombre;
                txt_descripcion.Text = grupoActual.descripcion;
                txt_multa.Text = grupoActual.multaDiaria.ToString();
                seleccionarTiposUsuario(grupoActual.tipoUsuarioCodigo);
                
            }
            else
            {
                limpiarCampos();
            }
        }

        /// <summary>
        /// en el combo box selecciona el nombre del tipoUsuario que se le indique
        /// de acuerdo con el parámetro que debe ser el código del tipoUsuario
        /// </summary>
        /// <param name="p"></param>
        private void seleccionarTiposUsuario(string p)
        {
            foreach (object act in cbx_tipoUsuario.Items)
            {
                if (((comboBoxItem)act).id == p)
                {
                    cbx_tipoUsuario.Text = ((comboBoxItem)act).mostrar;
                }
            }
        }

        /// <summary>
        /// lista en el ComboBox la lista que reciba por parámetro.
        /// Solamente listará los nombres del tipoUsuario
        /// </summary>
        /// <param name="tipoUsuarios"></param>
        private void llenearTipoUsuarios(LinkedList<tipoUsuario> tipoUsuarios)
        {
            cbx_tipoUsuario.Items.Clear();
            if (tipoUsuarios != null)
            {
                foreach (tipoUsuario act in tipoUsuarios)
                {
                    cbx_tipoUsuario.Items.Add(new comboBoxItem(act.codTipoUsuario, act.nombre));
                }
            }
        
        }

        /// <summary>
        /// llena las columnas de acuerdo con los campos del tipoPerfil
        /// </summary>
        private void llenarColumnas()
        {
            dgv_listado.Columns.Clear();
            dgv_listado.Columns.Add("columna0", "Id");
            dgv_listado.Columns[0].Visible = false;
            dgv_listado.Columns.Add("columna1", "Nombre");
            dgv_listado.Columns.Add("columna2", "Descripción");
            dgv_listado.Columns.Add("columna3", "Multa por Día");
        }

        /// <summary>
        /// lista en el DGV la lista de tipoUsuarios recibda
        /// </summary>
        /// <param name="grupos"></param>
        private void llenarDTGGrupo(LinkedList<grupo> grupos)   
        {
            llenarColumnas();
            if (grupos != null)
            {
                foreach (grupo act in grupos)
                {
                    dgv_listado.Rows.Add(act.codGrupo, act.nombre, act.descripcion, act.multaDiaria.ToString());
                }
            }
        }

        #endregion

        #region "controles"

        /// <summary>
        /// actualiza el estado de los botones de acuerdo con el estado que
        /// se encuentra la ventana(en modo consulta, edición o agregando nuevo)
        /// </summary>
        private void actualizarBotones()
        {
            if (estado.AGREGANDO())
            {
                btn_Nuevo.Enabled = false;
                btn_eliminar.Enabled = false;
                btn_guardar.Enabled = true;
                btn_editar.Enabled = false;
                btn_cancelar.Enabled = true;
            }
            else if (estado.EDITANDO())
            {
                btn_Nuevo.Enabled = false;
                btn_eliminar.Enabled = cp.usuarioActualPuede(acciones.GRUPOS_ELIMINAR);
                btn_guardar.Enabled = true;
                btn_editar.Enabled = false;
                btn_cancelar.Enabled = true;
            }
            else if (estado.CONSULTANDO())
            {
                btn_Nuevo.Enabled = cp.usuarioActualPuede(acciones.GRUPOS_AGREGAR);
                btn_eliminar.Enabled = grupoActual != null && cp.usuarioActualPuede(acciones.GRUPOS_ELIMINAR);
                btn_guardar.Enabled = false;
                btn_editar.Enabled = grupoActual != null && cp.usuarioActualPuede(acciones.GRUPOS_MODIFICAR_TODOS);
                btn_cancelar.Enabled = false;
            }
        }

        /// <summary>
        /// actualiza el estado de los campos de texto y CBX de acuerdo con el estado que
        /// se encuentra la ventana(en modo consulta, edición o agregando nuevo)
        /// </summary>
        private void actualizarCampos()
        {
            borrarError(txt_nombre);
            borrarError(txt_descripcion);
            borrarError(txt_multa);
            borrarError(cbx_tipoUsuario);
            lbl_mensajes.Text = string.Empty;
            val = true;

            if (estado.AGREGANDO())
            {
                txt_nombre.Enabled = true;
                txt_descripcion.Enabled = true;
                txt_multa.Enabled = true;
                cbx_tipoUsuario.Enabled = true;
            }
            else if (estado.EDITANDO())
            {
                txt_nombre.Enabled = true;
                txt_multa.Enabled = true;
                txt_descripcion.Enabled = true;
                cbx_tipoUsuario.Enabled = true;
            }
            else if (estado.CONSULTANDO())
            {
                txt_nombre.Enabled = false;
                txt_multa.Enabled = false;
                txt_descripcion.Enabled = false;
                cbx_tipoUsuario.Enabled = false;
            }
        }

        /// <summary>
        /// actualiza el estado del tipoUsrActua en caso de que haya
        /// alguno seleccionado del DGV
        /// </summary>
        private void actualizarTipoUsrActual()
        {
            if (estado.CONSULTANDO() && grupoActual != null)
            {
                grupoActual = getSelected();
                escribirGrupo();
            }
        }

        /// <summary>
        /// actualiza los campos y los botones
        /// </summary>
        private void actualizaControles()
        {
            actualizarBotones();
            actualizarCampos();
            actualizarTipoUsrActual();
        }

        /// <summary>
        /// limpia los campos de texto
        /// </summary>
        private void limpiarCampos()
        {
            txt_descripcion.Text = null;
            txt_multa.Text = null;
            txt_nombre.Text = null;
            cbx_tipoUsuario.Text = null;
        }

        #endregion

        #region "acciones"

        private void PasarAgregar()
        {
            if (estado.CONSULTANDO())
            {
                grupoActual = null;
                estado.agregar();
                actualizaControles();
                limpiarCampos();
            }
        }

        private void PasarConsulta()
        {
            bool modoConsulta = true;
            if (estado.AGREGANDO())
            {
                modoConsulta = confirmarOperacion("No se ha terminado de agregar el elemento");
            }
            else if (estado.EDITANDO())
            {
                modoConsulta = confirmarOperacion("Si continúa no se guardarán los cambios hechos");
            }
            if (modoConsulta)
            {
                estado.consultar();
                actualizaControles();
                if (grupoActual == null)
                {
                    limpiarCampos();
                }
                else
                {
                    escribirGrupo();
                }
            }
        }

        private void PasarEditar()
        {
            if (estado.CONSULTANDO() && grupoActual != null)
            {
                estado.editar();
                actualizaControles();
            }
        }

        private void agregarNuevoGrupo()
        {
            grupo nuevo = getFromFields();
            try
            {
                if (nuevo != null)
                {
                    cp.ctrlGrupos.agregarGrupo(nuevo);
                }
                estado.consultar();
                limpiarCampos();
                actualizaControles();
            }
            catch (Exception e)
            {
                ventanaError(e.Message);
            }
        }

        private void modificarGrupo()
        {
            grupo nuevo = getFromFields();
            try
            {
                if (nuevo != null && grupoActual != null && cp.ctrlGrupos.camposModificarValidos(nuevo))
                {
                    cp.ctrlGrupos.modificar(grupoActual.codGrupo, nuevo);
                }
                estado.consultar();
                limpiarCampos();
                actualizaControles();
            }
            catch (Exception e)
            {
                ventanaError(e.Message);
            }
        }

        private void eliminarGrupoSelected()
        {
            try
            {
                if (estado.EDITANDO() && grupoActual != null)
                {
                    cp.ctrlGrupos.eliminarGrupo(grupoActual.codGrupo);
                }
                else if (estado.CONSULTANDO() && grupoActual != null)
                {
                    cp.ctrlGrupos.eliminarGrupo(grupoActual.codGrupo);
                }
                estado.consultar();
                limpiarCampos();
                actualizaControles();
            }
            catch (Exception ex)
            {
                ventanaError(ex.Message);
            }
        }

        #endregion

        #region "métodos botones"

        private void btn_Nuevo_Click(object sender, EventArgs e)
        {
            PasarAgregar();
        }

        private void btn_cancelar_Click(object sender, EventArgs e)
        {
            PasarConsulta();
        }

        private void btn_guardar_Click(object sender, EventArgs e)
        {
            if (txt_nombre.Text.Equals(string.Empty))
            {
                setError(txt_nombre, "Ingrese un nombre de Grupo.");
            }
            else
            {
                borrarError(txt_nombre);
            }
            //if(txt_descripcion.Text.Equals(string.Empty))
            //{
            //    setError(txt_descripcion, "Ingrese una descripción para el Grupo.");
            //    val = false;
            //}
            if (txt_multa.Text.Equals(string.Empty))
            {
                setError(txt_multa, "Ingrese un monto de multa.");
            }
            else
            {
                borrarError(txt_multa);
            }
            if (cbx_tipoUsuario.SelectedIndex.Equals(-1))
            {
                setError(cbx_tipoUsuario, "Seleccione un Tipo de Usuario.");
            }
            else
            {
                borrarError(cbx_tipoUsuario);
            }
            if(erp_error.GetError(txt_nombre).Equals(string.Empty)
                //&& erp_error.GetError(txt_descripcion).Equals(string.Empty)
                && erp_error.GetError(txt_multa).Equals(string.Empty)
                && erp_error.GetError(cbx_tipoUsuario).Equals(string.Empty)
                ){
                if (estado.AGREGANDO())
                {
                    agregarNuevoGrupo();
                }
                if (estado.EDITANDO())
                {
                    modificarGrupo();
                }
            }
        }

        private void btn_editar_Click(object sender, EventArgs e)
        {
            PasarEditar();
        }

        private void btn_eliminar_Click(object sender, EventArgs e)
        {
            eliminarGrupoSelected();
        }

        #endregion

        #region "atributos"

        private bool val = true;
        private LinkedList<grupo> datosActuales;
        private grupo grupoActual;

        #endregion
    }
}
